# 需求:打印出薪资最高的那个人的名字
from functools import reduce

salary_dic = {'tom': 100, 'alex': 500, 'jack': 200}
print(salary_dic['tom'])
res = max(salary_dic)
print(res)
# max直接迭代字典,只会把字典的key作为比较依据,我们需要把值作为依据,可指定key的值
def func(k):
    return salary_dic[k]


res = max(salary_dic, key=func)
# max会把迭代的每一个值传递给key指定的函数内存地址当做实参,然后通过函数的返回值作为比较的依据
print(res)     # alex

# k就是函数的形参,实参在代码层面你是看不到的,但是执行起来会传参
res = max(salary_dic, key=lambda k: salary_dic[k])
print(res)

# max取最大,min取最小
res1 = min(salary_dic, key=lambda k: salary_dic[k])
print(res1)

res2 = sorted(salary_dic, key=lambda k: salary_dic[k])
print(res2)
print('*'*30)
#函数map、filter 、reduce都支持迭代器协议，可以用来处理可迭代对象
# 1. 把列表中的人名都追加上_dsb
l = ["tao", 'fang', 'huang']

res3 = map(lambda name: name + "_dsb", l)  # map会把l的值迭代出来交给前面打的函数,然后返回一个迭代器
print(res3, type(res3))
for i in res3:
    print(i)

# print(res3.__next__())  # 上面代码已经把迭代器里面的值取完了,再取就报错了
#
# 去掉有sb(帅逼)结尾的名字
l2 = ['tao_dsb', 'fang', 'huang']


res2 = filter(lambda name: not name.endswith("sb"), l2)
# filter会迭代l2里面的值,传递给lambda,如果返回值为true就保留原来的值,否则就过滤掉
print(list(res2))

l3 = [1, 2, 3, 4, ]
res3 = reduce(lambda x, y: x + y, l3)
# 可以指定初始值,如果不指定,默认从l中取出两个参数,得到的返回值作为下一次的一个参数
print(res3)   # 10

res4 = reduce(lambda x, y: x + y, ['a','b','c'],"hello")
print(res4)  # helloabc